﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SmallBasic.Library;

namespace Dozens4SmallBasic
{
    /// <summary>
    /// Dozens オブジェクトは、DNS サービス "Dozens" の REST API を呼び出して、ゾーンやレコードの追加・取得・変更・削除を行います。
    /// </summary>
    [SmallBasicType]
    public static class Dozens
    {
        private static DozensAPI.Dozens _client;

        private static DozensAPI.Dozens client
        {
            get
            {
                if (_client == null)
                {
                    _client = new DozensAPI.Dozens();
                }
                return _client;
            }
        }

        /// <summary>
        /// Dozens REST API の URL を取得または設定します。既定では "http://dozens.jp/api" に初期化されます。
        /// </summary>
        public static Primitive BaseURL {
            get { return client.BaseURL; }
            set { client.BaseURL = value; }
        }

        /// <summary>
        /// Dozens アカウントの ID と API KEY を指定して、認証を行います。 
        /// </summary>
        /// <param name="dozensUserId">Dozens に開設したアカウントの ID。</param>
        /// <param name="apiKey">そのアカウントの API KEY。API KEY は Doznes の Web サイトにログインして、プロフィールのページ(https://dozens.jp/profile)から入手できます。</param>
        public static void Auth(Primitive dozensUserId, Primitive apiKey)
        {
            client.Auth(dozensUserId, apiKey);
        }

        #region manipulate zones.

        /// <summary>
        /// ゾーン(ドメイン)リストを取得します。
        /// </summary>
        /// <returns>登録されているすべてのゾーンの配列</returns>
        public static Primitive GetZones()
        {
            var zones = client.GetZones();
            return zones.ToPrimitive();
        }

        /// <summary>
        /// ゾーンを新規登録します。
        /// </summary>
        /// <param name="zoneName">新規登録するゾーンの名前。(例: "dozens.jp")</param>
        /// <returns>登録されているすべてのゾーンの配列</returns>
        public static Primitive CreateZone(Primitive zoneName)
        {
            var zones = client.CreateZone(zoneName);
            return zones.ToPrimitive();
        }

        /// <summary>
        /// ゾーンを削除します。
        /// </summary>
        /// <param name="zoneNameOrId">削除するゾーンの名前 (例: "dozens.jp")、またはゾーンの ID (数値)。</param>
        /// <returns>登録されているすべてのゾーンの配列</returns>
        public static Primitive DeleteZone(Primitive zoneNameOrId)
        {
            var zoneId = -1;
            if (int.TryParse(zoneNameOrId, out zoneId))
            {
                return client.DeleteZone(zoneId).ToPrimitive();
            }
            return client.DeleteZone((string)zoneNameOrId).ToPrimitive();
        }
        
        #endregion

        #region manipulate records.

        /// <summary>
        /// 指定したゾーンに登録されているレコードリストを取得します。
        /// </summary>
        /// <param name="zoneName">レコードリストを取得する対象のゾーンの名前。 (例: "dozens.jp")</param>
        /// <returns>指定のゾーンに登録されているすべてのレコードの配列</returns>
        public static Primitive GetRecords(Primitive zoneName)
        {
            return client.GetRecords(zoneName).ToPrimitive();
        }

        /// <summary>
        /// 指定のゾーンにレコードを新規登録します。
        /// </summary>
        /// <param name="zoneName">レコードを新規登録する対象のゾーン名。 (例: "dozens.jp")</param>
        /// <param name="name">新規登録するレコードの名前。 (例: "www", "www.dozens.jp")</param>
        /// <param name="type">新規登録するレコードのタイプ。 (例: "A", "CNAME", "MX", "TXT")</param>
        /// <param name="prio">新規登録するレコードのプライオリティ。数値か "" を指定できます。</param>
        /// <param name="content">新規登録するレコードの値。</param>
        /// <param name="ttl">新規登録するレコードの TTL。Dozens の契約プランによって指定可能な TTL が異なります。Free プランだと 7200 だけが指定できます。</param>
        /// <returns>レコード新規登録先のゾーンに登録されているすべてのレコードの配列</returns>
        public static Primitive CreateRecord(Primitive zoneName, Primitive name, Primitive type, Primitive prio, Primitive content, Primitive ttl)
        {
            return client.CreateRecord(zoneName, name, type, (string)prio, content, ttl).ToPrimitive();
        }

        /// <summary>
        /// レコードの登録内容を変更(更新)します。
        /// </summary>
        /// <param name="fqdnOrRecordId">変更(更新)対象のレコードを特定する FQDN (例: "www.dozens.jp")、またはレコードの ID (数値)。</param>
        /// <param name="prio">変更後のプライオリティ。数値か、"" が指定できます。</param>
        /// <param name="content">変更後の値。</param>
        /// <param name="ttl">変更後の TTL。Dozens の契約プランによって指定可能な TTL が異なります。Free プランだと 7200 だけが指定できます。</param>
        /// <returns>変更対象のレコードと同じゾーンに登録されているすべてのレコードの配列</returns>
        public static Primitive UpdateRecord(Primitive fqdnOrRecordId,Primitive prio, Primitive content,Primitive ttl)
        {
            var recordId = -1;
            if (int.TryParse(fqdnOrRecordId, out recordId))
            {
                return client.UpdateRecord(recordId, (string)prio, (string)content, (int)ttl).ToPrimitive();
            }
            return client.UpdateRecord((string)fqdnOrRecordId, (string)prio, (string)content, (int)ttl).ToPrimitive();
        }

        /// <summary>
        /// レコードを削除します。
        /// </summary>
        /// <param name="fqdnOrRecordId">変更(更新)対象のレコードを特定する FQDN (例: "www.dozens.jp")、またはレコードの ID (数値)。</param>
        /// <returns>削除対象のレコードと同じゾーンに登録されているすべてのレコードの配列</returns>
        public static Primitive DeleteRecord(Primitive fqdnOrRecordId)
        {
            var recordId = -1;
            if (int.TryParse(fqdnOrRecordId, out recordId))
            {
                return client.DeleteRecord(recordId).ToPrimitive();
            }
            return client.DeleteRecord((string)fqdnOrRecordId).ToPrimitive();
        }

        #endregion
    }
}
